/**
 * 加载并解析 JSON 数据基类
 * ibio-develop
 * 2009-7-10 23:19
 */
package com.ibio8.net {
	import com.ibio8.net.NetUtil;
	
	import flash.events.Event;
	import flash.net.URLLoader;
	/**
	 * 加载并解析数据（例如 JSON、XML 等）基类。
	 * 
	 * <p>
	 * 可以加载 url 形式或者字符串形式的 JSON 数据，并解析。
	 * 注意：此类必须要有 handler，否则里面的 NetUtil.getData 所传递的回调函数将会 call 不到。
	 * </p>
	 */
	public class BaseDataLoader {
		/** @private **/
		protected var m_loader:URLLoader;
		
		/**
		 * 加载数据
		 * @param	data	若该数据是 url，则先加载在解析，若该数据是 JSON 字符串，
		 * 则直接解析。
		 */
		public function load(data:String):void {
			NetUtil.destroy(m_loader);
			if (data) {
				//判断是 JSON 还是 url
				if((data.indexOf('"') > -1) &&
				   (data.indexOf(':') > -1) &&
				   (((data.indexOf('[') > -1) && (data.indexOf(']') > -1)) || ((data.indexOf('{') > -1) && (data.indexOf('}') > -1)))) {
					//JSON
					paseData(data);
				}else {
					m_loader = NetUtil.getData(data, null, onDataLoaded, onDataError, false, false, 0);
				}
			}else {
				trace("BaseDataLoader::load/NetUtil.getData()->参数 data 可能为空，data:", data);
			}
		}
		
		/**
		 * 解析加载的数据数据，该方法应在子类覆盖
		 * @param	data	数据
		 */
		protected function paseData(data:String):void {
			//在子类继承
		}
		
		/**
		 * 加载完毕
		 * @param	e	Flash 事件（Event）
		 */
		protected function onDataLoaded(e:Event):void {
			NetUtil.destroy(m_loader);
			//
			paseData(e.currentTarget.data);
		}
		
		/**
		 * 加载出错
		 * @param	e	Flash 事件（Event）
		 */
		protected function onDataError(e:Event):void{
			NetUtil.destroy(m_loader);
			//
			trace("BaseDataLoader::onDataError->", e.clone());
			//在子类继承
		}
	}
}